#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>

#define MAX_NAME_LENGTH 50
#define MAX_RECORDS 100
#define DEFAULT_FILENAME "data.csv"

// 定义人员数据结构
typedef struct {
    char name[MAX_NAME_LENGTH];
    int age;
    char gender[10];
    float salary;
    char department[30];
    char hire_date[11]; // YYYY-MM-DD 格式
} Person;

// 函数声明
void generate_sample_data(Person *people, int count);
int write_csv(const char *filename, Person *people, int count);
void print_usage(const char *program_name);
void sanitize_string(char *str);
void format_date(char *date_str);

int main(int argc, char *argv[]) {
    char *filename = DEFAULT_FILENAME;
    int record_count = 10; // 默认生成10条记录
    Person *people;

    // 解析命令行参数
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
            print_usage(argv[0]);
            return 0;
        } else if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0) {
            if (i + 1 < argc) {
                filename = argv[i + 1];
                i++;
            } else {
                fprintf(stderr, "错误: -f/--file 参数需要指定文件名\n");
                print_usage(argv[0]);
                return 1;
            }
        } else if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--num-records") == 0) {
            if (i + 1 < argc) {
                int num = atoi(argv[i + 1]);
                if (num > 0 && num <= MAX_RECORDS) {
                    record_count = num;
                } else {
                    fprintf(stderr, "错误: 记录数量必须在1到%d之间\n", MAX_RECORDS);
                    return 1;
                }
                i++;
            } else {
                fprintf(stderr, "错误: -n/--num-records 参数需要指定记录数量\n");
                print_usage(argv[0]);
                return 1;
            }
        } else {
            fprintf(stderr, "错误: 未知参数 '%s'\n", argv[i]);
            print_usage(argv[0]);
            return 1;
        }
    }

    // 分配内存存储人员数据
    people = (Person *)malloc(record_count * sizeof(Person));
    if (people == NULL) {
        fprintf(stderr, "错误: 内存分配失败\n");
        return 1;
    }

    // 初始化随机数生成器
    srand(time(NULL));

    // 生成样本数据
    generate_sample_data(people, record_count);

    // 写入CSV文件
    if (write_csv(filename, people, record_count) != 0) {
        free(people);
        return 1;
    }

    // 释放内存
    free(people);

    printf("成功: %d 条记录已写入到 '%s' 文件\n", record_count, filename);
    return 0;
}

// 生成样本数据
void generate_sample_data(Person *people, int count) {
    const char *first_names[] = {"张", "李", "王", "刘", "陈", "杨", "赵", "黄", "周", "吴"};
    const char *last_names[] = {"伟", "芳", "娜", "秀英", "敏", "静", "强", "磊", "军", "洋"};
    const char *departments[] = {"技术部", "市场部", "人力资源部", "财务部", "销售部", "研发部"};
    const char *genders[] = {"男", "女"};

    for (int i = 0; i < count; i++) {
        // 生成随机姓名
        sprintf(people[i].name, "%s%s", 
                first_names[rand() % (sizeof(first_names) / sizeof(first_names[0]))],
                last_names[rand() % (sizeof(last_names) / sizeof(last_names[0]))]);
        sanitize_string(people[i].name);

        // 生成随机年龄 (20-60岁)
        people[i].age = 20 + rand() % 41;

        // 生成随机性别
        strcpy(people[i].gender, genders[rand() % 2]);
        sanitize_string(people[i].gender);

        // 生成随机薪资 (5000-25000元)
        people[i].salary = 5000 + (rand() % 20001) + (rand() % 100) / 100.0;

        // 生成随机部门
        strcpy(people[i].department, 
               departments[rand() % (sizeof(departments) / sizeof(departments[0]))]);
        sanitize_string(people[i].department);

        // 生成随机入职日期 (过去5年内)
        time_t now = time(NULL);
        struct tm *tm_info = localtime(&now);
        tm_info->tm_year -= rand() % 5; // 减去0-4年
        tm_info->tm_mday = 1 + rand() % 28; // 避免处理月末天数问题
        mktime(tm_info); // 规范化时间结构
        strftime(people[i].hire_date, sizeof(people[i].hire_date), "%Y-%m-%d", tm_info);
    }
}

// 将数据写入CSV文件
int write_csv(const char *filename, Person *people, int count) {
    FILE *file = NULL;
    int result = 0;

    // 在Windows环境下使用UTF-8编码打开文件
#ifdef _WIN32
    file = fopen(filename, "w, ccs=UTF-8");
#else
    file = fopen(filename, "w");
#endif

    if (file == NULL) {
        fprintf(stderr, "错误: 无法打开文件 '%s': %s\n", filename, strerror(errno));
        return 1;
    }

    // 写入CSV文件头
    fprintf(file, "姓名,年龄,性别,薪资,部门,入职日期\n");

    // 写入数据记录
    for (int i = 0; i < count; i++) {
        fprintf(file, "%s,%d,%s,%.2f,%s,%s\n",
                people[i].name,
                people[i].age,
                people[i].gender,
                people[i].salary,
                people[i].department,
                people[i].hire_date);
    }

    // 关闭文件
    if (fclose(file) != 0) {
        fprintf(stderr, "错误: 关闭文件 '%s' 失败: %s\n", filename, strerror(errno));
        result = 1;
    }

    return result;
}

// 打印程序使用说明
void print_usage(const char *program_name) {
    printf("CSV 数据保存工具\n\n");
    printf("用法: %s [选项]\n\n", program_name);
    printf("选项:\n");
    printf("  -h, --help              显示此帮助信息并退出\n");
    printf("  -f, --file 文件名       指定输出的CSV文件名 (默认: %s)\n", DEFAULT_FILENAME);
    printf("  -n, --num-records 数量  指定生成的记录数量 (默认: 10, 范围: 1-%d)\n", MAX_RECORDS);
    printf("\n示例:\n");
    printf("  %s                       使用默认设置生成CSV文件\n", program_name);
    printf("  %s -f employees.csv      将数据保存到employees.csv\n", program_name);
    printf("  %s -n 20                 生成20条记录\n", program_name);
    printf("  %s -f staff.csv -n 15    生成15条记录并保存到staff.csv\n", program_name);
}

// 清理字符串（处理CSV格式中的特殊字符）
void sanitize_string(char *str) {
    // 此函数可以进一步扩展以处理CSV中的特殊字符，如逗号、引号等
    // 当前版本简化处理
    return;
}

// 格式化日期（简化版）
void format_date(char *date_str) {
    // 此函数可以扩展为格式化不同的日期格式
    return;
}
